﻿/*
 * Ficheiro criaDados.cs
 * Aluno: João Guerreiro
 * 13730
 */
using System;
using System.Data.SQLite;
using Excel = Microsoft.Office.Interop.Excel;
using System.Collections.Generic;


namespace readExcel
{
	/// <summary>
	/// Classe que cria e manipula bases de dados extraidos do excel
	/// </summary>
	public class CriacaoDados
	{
		Excel.Application xlApp ;
		Excel.Workbook xlWorkBook ;
		Excel.Worksheet xlWorkSheet ;
		Excel.Range range ;
		SQLiteConnection m_dbConnection;
		
		List<double> lista_valores = new List<double>();
		
		/// <summary>
		/// construtor 
		/// </summary>
		public CriacaoDados()
		{
			//iniciacao do excel
			
			//localizacao do ficheiro
			string path = @"C:\Users\JOHNNY\Desktop\repositorio\srccsharp\lp1415_csharp\readExcel\IPC_Portugal_1977_2013.xls";
			path = System.IO.Path.GetFullPath(path);
			xlApp = new Excel.Application();
			xlWorkBook = xlApp.Workbooks.Open(path);
			xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
		}
		
		
		/// <summary>
		/// metodo que cria a ligacao a base de dados
		/// </summary>
		public void criaBaseDados(){
			//criacao da base de dados e conexao a mesma
			SQLiteConnection.CreateFile("Dados_IPC.db");
			
			m_dbConnection =
				new SQLiteConnection("Data Source=Dados_IPC.db;Version=3;");
			//abertura da comunicacao
			m_dbConnection.Open();
			
			
			//comando para efectuar accoes na base de dados
			SQLiteCommand sqlite_cmd = m_dbConnection.CreateCommand();
			
			//cria tabela
			sqlite_cmd.CommandText = "CREATE TABLE IPC_Portugal (ano integer, ipc real, variacao_anual real, rmin real, rmax real, pib real, rendim_nacional real, rendim_disp real, remun_capita real)";
			sqlite_cmd.ExecuteNonQuery();
			//Console.Write("tabela criada. Prima qualquer tecla para continuar...");
			//Console.ReadKey(true);

			
			//insercao dos dados na base de dados sqlite
			range = xlWorkSheet.UsedRange;
			int rowCount = xlWorkSheet.Rows.Count;
			int colCount = xlWorkSheet.Columns.Count;
			
			for (int i = 2; i <= 38; i++)
			{
				for (int j = 2; j <= 10; j++)
				{
					//caso o valor da celula seja null, adiciona o valor zero a lista
					if(((range.Cells[i, j] as Excel.Range).Value2) == null)
					{
						lista_valores.Add(0);
					}
					else
					{
						//caso o valor seja double, efectua a formatacao donumero para duas casas decimais
						double range_values = (double)(range.Cells[i, j] as Excel.Range).Value2;
						double m = Math.Round(range_values,1);
						lista_valores.Add(m);
					}
				}
				
				//apresentacao dos valores na consola
				
				string values = string.Join(";", lista_valores.ToArray());
				//Console.WriteLine(values);
				
				// insert dos dados na base de dados
				sqlite_cmd.CommandText = "INSERT INTO IPC_Portugal (ano, ipc, variacao_anual, rmin, rmax, pib, rendim_nacional, rendim_disp, remun_capita) VALUES (@p1, @p2, @p3,@p4, @p5, @p6,@p7, @p8, @p9);";
				sqlite_cmd.Parameters.AddWithValue("@p1", lista_valores[0]);
				sqlite_cmd.Parameters.AddWithValue("@p2", lista_valores[1]);
				sqlite_cmd.Parameters.AddWithValue("@p3", lista_valores[2]);
				sqlite_cmd.Parameters.AddWithValue("@p4", lista_valores[3]);
				sqlite_cmd.Parameters.AddWithValue("@p5", lista_valores[4]);
				sqlite_cmd.Parameters.AddWithValue("@p6", lista_valores[5]);
				sqlite_cmd.Parameters.AddWithValue("@p7", lista_valores[6]);
				sqlite_cmd.Parameters.AddWithValue("@p8", lista_valores[7]);
				sqlite_cmd.Parameters.AddWithValue("@p9", lista_valores[8]);
				//executa o insert
				sqlite_cmd.ExecuteNonQuery();
				
				//elimina os valores da lista para nova iteracao sobre uma nova linha do excel
				lista_valores.Clear();
			}
			
		}
		
		
		/// <summary>
		/// metodo que encerra a conexao a base de dados
		/// </summary>
		public void fechaConexao(){
			//encerra o processo
			xlWorkBook.Close(0);
			xlApp.Quit();
			
			//fecho da ligaçao excel
			System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet);
			System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook);
			System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);

			//fecho da ligacao a base de dados
			m_dbConnection.Close();
			
		}
		
		
	}
}
